//#include<iostream>
//using namespace std;
//#include<vector>
//int s[200000][2] = { 0 };
//int ans_find(vector<int>& num, int val)
//{
//	for (int i = 0; i < num.size(); i++)
//	{
//		if (num[i] == val)
//			return i;
//	}
//	return -1;
//}
//void sort_s(int a[][2], int n)
//{
//	int gap = n;
//	
//	while (gap > 1)
//	{
//		//gap = gap / 2;
//		gap = gap / 3 + 1;
//
//		for (int i = 0; i < n - gap; ++i)
//		{
//			int end = i;
//			int tmp = a[end + gap][0];
//			int tmp2 = a[end + gap][1];
//			while (end >= 0)
//			{
//				if (tmp < a[end][0])
//				{
//					a[end + gap][0] = a[end][0];
//					end -= gap;
//				}
//				else
//				{
//					break;
//				}
//			}
//			a[end + gap][0] = tmp;
//			a[end + gap][1] = tmp2;
//		}
//	}
//}
//int main()
//{
//	int m, n;
//	cin >> m >> n;
//	vector<int> num;
//	vector<int> A;
//	int i = 0;
//	for (i = 1; i <= m; i++)
//	{
//		num.push_back(i);
//	}
//	int flag = n-2;
//	sort_s(s, n);
//	for (i = 0; i < n; i++)
//	{
//		cin >> s[i][0] >> s[i][1];
//	}
//	
//		i = 0;
//		for (i; i < n; i++)
//		{
//			int a = s[i][0];
//			int b=s[i][1];
//			if (A.size() == 0)
//			{
//				A.push_back(a);
//				A.push_back(b);
//			}
//			else
//			{
//				int ans1 = ans_find(A, a);
//				int ans2 = ans_find(A, b);
//				if (ans1 == -1 && ans2 != -1)
//				{
//					if (ans2 == 0)
//					{
//						A.insert(A.begin(), a);
//					}
//				}
//				else if (ans1 != -1 && ans2 == -1)
//				{
//					if (ans1 == A.size() - 1)
//					{
//						A.insert(A.end(), b);
//					}
//				}
//			}
//		}
//	
//	if (A.size() == m)
//	{
//		cout << "Yes" << endl;
//		for (auto i : num)
//		{
//			cout << num[i-1] << ' ';
//		}
//	}
//	else
//	{
//		cout << "No";
//	}
//}
//#include<iostream>
//using namespace std;
//int main()
//{
//	int m, n;
//	string s;
//	cin >> m >> n;
//	cin >> s;
//	string s2;
//	int num = 0;
//	int k = 0;
//	while (num < n&&k<s.size())
//	{
//		s2.push_back(s[k++]);
//		if (s[k - 1] == 'o')
//			num++;
//	}
//	k = m - k;
//	while (k--)
//	{
//		s2.push_back('x');
//	}
//	cout << s2;
//
//}
//#include<iostream>
//using namespace std;
//int cmp(const void* a, const void* b)
//{
//	return *(double*)a - *(double*)b;
//}
//int main()
//{
//	int n;
//	cin >> n;
//	double* a = new double[5 * n];
//	for (int l = 0; l < 5 * n; l++)
//	{
//		cin >> a[l];
//	}
//	qsort(a, 5 * n, sizeof(double), cmp);
//	int k = 5 * n;
//	double sum = 0;
//	for (int i = n; i < k - n; i++)
//	{
//		sum += a[i];
//	}
//	double j = 3 * n;
//	sum =sum/j;
//	cout << sum;
//}
//#include<iostream>
//using namespace std;
//#include<set>
//set<int> v[400002];
//
//int main()
//{
//	int n;
//	string s;
//	cin >> n;
//	cin >> s;
//	int x = 200000;
//	int y = 0;
//	int flag = 1;
//	v[x].insert(y);
//	int k = 0;
//	while (n--)
//	{
//		if (flag)
//		{
//			char c = s[k++];
//			if (c == 'R')
//				x++;
//			else if (c == 'L')
//				x--;
//			else if (c == 'U')
//				y--;
//			else
//				y++;
//			if (v[x].find(y) != v[x].end())
//			{
//				flag = 0;
//			}
//			else
//			{
//				v[x].insert(y);
//			}
//		}
//		else
//			break;
//	}
//	if (flag==0)
//		cout << "Yes";
//	else
//		cout << "No";
//}
#include<iostream>
using namespace std;
#include<vector>;
#include<queue>;
typedef struct node
{
	int v;
	struct node* pre=nullptr;
	struct node* next=nullptr;
	node(int val)
		:v(val)
	{

	}
}node;
vector<node> v;
vector<int> num;
queue<int> q;
int main()
{
	int m, n;
	cin >> m >> n;
	for (int i = 0; i <= m; i++)
	{
		v.push_back(node(i));
		num.push_back(i);
	}
	for (int i = 1; i <=n; i++ )
	{

		int a;
		int b;
		cin >> a >> b;
		v[a].next = &v[b];
		v[b].pre = &v[a];
	}
	for (int i = 1; i <= m; i++)
	{
		if (v[i].pre == nullptr)
		{
			q.push(i);
			break;
		}
	}
	node* head = &v[q.back()];
	head = head->next;
	while (head)
	{
		q.push(head->v);
	}
	if (q.size() != m)
	{
		cout << "No";
	}
	else
	{
		cout << "Yes" << endl;
		for (auto i : v)
		{
			cout << num[i.v] << ' ';
		}
	}
}